<?php
/**
 * Code for using a proxy XRI resolver.
 */

require_once 'Auth/Yadis/XRDS.php';
require_once 'Auth/Yadis/XRI.php';

class Auth_Yadis_ProxyResolver {

  function Auth_Yadis_ProxyResolver(&$fetcher, $proxy_url = null) {
    $this->fetcher = & $fetcher;
    $this->proxy_url = $proxy_url;
    if (! $this->proxy_url) {
      $this->proxy_url = Auth_Yadis_getDefaultProxy();
    }
  }

  function queryURL($xri, $service_type = null) {
    // trim off the xri:// prefix
    $qxri = substr(Auth_Yadis_toURINormal($xri), 6);
    $hxri = $this->proxy_url . $qxri;
    $args = array('_xrd_r' => 'application/xrds+xml');
    
    if ($service_type) {
      $args['_xrd_t'] = $service_type;
    } else {
      // Don't perform service endpoint selection.
      $args['_xrd_r'] .= ';sep=false';
    }
    
    $query = Auth_Yadis_XRIAppendArgs($hxri, $args);
    return $query;
  }

  function query($xri, $service_types, $filters = array()) {
    $services = array();
    $canonicalID = null;
    foreach ($service_types as $service_type) {
      $url = $this->queryURL($xri, $service_type);
      $response = $this->fetcher->get($url);
      if ($response->status != 200 and $response->status != 206) {
        continue;
      }
      $xrds = Auth_Yadis_XRDS::parseXRDS($response->body);
      if (! $xrds) {
        continue;
      }
      $canonicalID = Auth_Yadis_getCanonicalID($xri, $xrds);
      
      if ($canonicalID === false) {
        return null;
      }
      
      $some_services = $xrds->services($filters);
      $services = array_merge($services, $some_services);
      // TODO:
    //  * If we do get hits for multiple service_types, we're
    //    almost certainly going to have duplicated service
    //    entries and broken priority ordering.
    }
    return array($canonicalID, $services);
  }
}

